/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package negocio;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import controlador.CtrlPersistencia;
import excepciones.NonexistentEntityException;
import javax.persistence.Column;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;


/**
 *
 * @author diego
 */
@Entity
public class Sala implements Serializable, Comparable {
    
    @Id    
    @Column(name="SALA_ID")
    private Integer id;
    
    @OneToMany  
    (mappedBy="sala")
    @JoinTable(name="SALA_SECCION",joinColumns={@JoinColumn(name="SALA_ID", referencedColumnName="SALA_ID")},inverseJoinColumns={@JoinColumn(name="SECCION_ID",referencedColumnName="SECCION_ID", unique=true)})    
    private Set<Seccion> secciones; 
    
    @Basic
    private String nombre;
    
    @Basic
    private boolean estado;
    
    @Basic
    private Integer capacidad;    
    /*
    @OneToMany
    private Set<Funcion> funciones;
    */
    public Sala() {
    }

    public Sala(Integer id,String nombre,Integer capacidad,boolean estado) {
        this.id = id;
        this.nombre = nombre;
        this.estado = estado;
        this.secciones = new HashSet();
        this.capacidad = capacidad;
        
        
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Set<Seccion> getSecciones() {
        return secciones;
    }

    public void setSecciones(Set<Seccion> secciones) {
        this.secciones = secciones;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public boolean isEstado() {
        return estado;
    }
    
    public boolean getEstado() {
        return estado;
    }

    public void setEstado(boolean estado) {
        this.estado = estado;
    }

    public Integer getCapacidad() {
        return capacidad;
    }

    public void setCapacidad(Integer capacidad) {
        this.capacidad = capacidad;
    }
    
    
   
    /* 
    public Map<String,Butaca> obtenerButacas(Funcion unaFuncion){
        Map<String,Butaca> butacas = new HashMap();
        Seccion UnaSeccion;
        
        Iterator it = this.secciones.iterator();
        
        while(it.hasNext()){
            UnaSeccion = (Seccion) it.next();
            butacas.putAll(UnaSeccion.obtenerButacas());
        }
        
        return null;
    }
    */
    public void agregarSeccion(String unCodigo) throws Exception{
        Integer idSeccion = CtrlPersistencia.maxSeccionId() + 1;
        Seccion unaSeccion = new Seccion(idSeccion,unCodigo,this);
        this.secciones.add(unaSeccion);
        CtrlPersistencia.crearSeccion(unaSeccion);
        CtrlPersistencia.modificarSala(this);
        
    }
    public void modificarSeccion(Seccion unaSeccion) throws NonexistentEntityException, Exception{
        CtrlPersistencia.modificarSeccion(unaSeccion);
        CtrlPersistencia.modificarSala(this);
    }
    
    
    /*
    public void quitarSecciones(){
        Iterator it = this.secciones.entrySet().iterator();
        Seccion unaSeccion;
        while(it.hasNext()){
            unaSeccion = (Seccion) it.next();
            unaSeccion.quitarfilas();
           // this.secciones.remove(unaSeccion);
            unaSeccion.deshabilitar();
        }
        
        
    }
    */
    
    public  Set<Seccion> ObtenerSecciones(){
        Set<Seccion> lista;
        lista = CtrlPersistencia.listaDeSecciones(this);        
        this.setSecciones(lista);
        return lista;
    }
    public  Set<Seccion> ObtenerSeccionesActivas(){
        Set<Seccion> lista;
        lista = CtrlPersistencia.listaDeSecciones(this);        
        this.setSecciones(lista);
        return lista;
    }
    
    public void habilitar(){
        this.setEstado(true);
        
    }
    public void deshabilitar(){
        this.setEstado(false);
    }
    
    @Override
    public String toString(){
        return this.getNombre();
    }
    
    
    public void actualizar(String unNombre,Integer capacidad,boolean estado) throws Exception{
        this.setNombre(unNombre);
        this.capacidad = capacidad;
        this.estado = estado;
        CtrlPersistencia.modificarSala(this);
        
    }

    @Override
    public int compareTo(Object o) {
        Sala sala = (Sala) o;
        return this.getNombre().compareTo(sala.getNombre());
    }
    
    public int capacidad(){
        int salida = 0;
        for (Seccion sec : this.secciones) {
            salida = salida + sec.capacidad();
        }
        return salida ;
    }
}
